package com.xiyou.weblog.common.domain.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.xiyou.weblog.common.domain.dos.ArticleCategoryRelDO;

import java.util.List;

/**
 * @author xiyou
 * @description 文章分类关联表
 */
public interface ArticleCategoryRelMapper extends BaseMapper<ArticleCategoryRelDO> {

    /**
     * 根据文章 ID 删除关联记录
     */
    default int deleteByArticleId(Long articleId) {
        return delete(Wrappers.<ArticleCategoryRelDO>lambdaQuery()
                .eq(ArticleCategoryRelDO::getArticleId, articleId));
    }

    /**
     * 根据文章id查询
     */
    default ArticleCategoryRelDO selectByArticleId(Long articleId) {
        return selectOne(Wrappers.<ArticleCategoryRelDO>lambdaQuery()
                .eq(ArticleCategoryRelDO::getArticleId, articleId));
    }

    /**
     * 根据文章分类 ID 查询
     */
    default ArticleCategoryRelDO selectOneByCategoryId(Long categoryId){
        return selectOne(Wrappers.<ArticleCategoryRelDO>lambdaQuery()
        .eq(ArticleCategoryRelDO::getCategoryId, categoryId)
                .last("limit 1"));
        /*
        SQL 性能优化：通过分类 ID 查询关联记录，从业务角度进行分析，当存在任何一条记录时，
        则都应该不允许删除。由于分类-文章是一对多的关系，也就是说会查询出多条数据，
        这里通过 last() 方法为 SQL 结尾添加 LIMIT 1 , 保证只查询到第一条即可，
        可以提升查询性能，若不添加 LIMIT 1 , 由于查询字段并没有添加唯一索引，
        MYSQL 还会继续往下查询，将所有属于该分类中的记录都查询出来。
         */
    }

    /**
     * 根据文章集合批量查询
     */
    default List<ArticleCategoryRelDO> selectByArticles(List<Long> articleIds){
        return selectList(Wrappers.<ArticleCategoryRelDO>lambdaQuery()
                .in(ArticleCategoryRelDO::getArticleId, articleIds));
    }

    /**
     * 根据分类 ID 查询所有有关的文章
     */
    default List<ArticleCategoryRelDO> selectListByCategoryId(Long categoryId){
        return selectList(Wrappers.<ArticleCategoryRelDO>lambdaQuery()
                .eq(ArticleCategoryRelDO::getCategoryId, categoryId));
    }
}
